/* --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : LIN.c
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Date           : 2020-07-28
    Description    : This file contains LIN function used for Motor Control.
----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
------------------------------------------------------------------------------------------------- */
#include <LIN.h>
#include <FLASH.h>
#include "FU68xx_4_MCU.h"

void Inquire_ID(uint8 PCI, uint8 DID);
void Maste_Control(uint8 PCI, uint8 DID, uint8 POST);
void Read_Version(uint8 PCI, uint16 DID);

void Authentication_mode(uint8 PCI, uint8 DID);
void AKey_mode(uint8 PCI, uint8 DID);
void Authentication_delay(void);
void Change_NAD(uint8 PCI, uint8 DID, uint8 NAD);
void Change_AGS(uint8 PCI, uint8 DID, uint8 Cdata);
void Quit_Authentication(uint8 PCI, uint8 DIDH, uint8 DIDL);




Safety_Verification Safety; //安全验证
uint16 Security_time;       //安全验证时间
LIN_Diagnosis Maste_Data;
LIN_Diagnosis AGS_ReplyData; // ags回复信息


uint8 AGS_New_NAD = 0;
uint8 xdata ucaLinBuff[8] =
    {
        0x68, 0x04, 0x12, 0x35, 0x79, 0xab, 0xcd, 0xef};
/* -------------------------------------------------------------------------------------------------
    Function Name  : SetIRQ_LIN
    Description    : 中断使能以及优先级设置
    Date           : 2020-07-18
    Parameter      : eIRQ: [输入] True-->使能，False-->不使能。
**                   eIP:  [输入] LIN中断优先级,1~4级分别对应：LIN_IRQ_L1，LIN_IRQ_L2，LIN_IRQ_L3，LIN_IRQ_L4
------------------------------------------------------------------------------------------------- */
void SetIRQ_LIN(ebool eIRQ, eType_LIN_IRQ eIP)
{
    SetReg(LIN_CR, LINIE, eIRQ ? LINIE : 0);

    if (eIRQ)
    {
        SetReg(IP3, PSPI_UT21 | PSPI_UT20, eIP);
    }
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Verify_Mode_Configuration
    Description    : 校验模式配置
    Date           : 2020-07-18
    Parameter      : eCHKMOD: [输入] CHKMOD_Standard-->标准校验，CHKMOD_Enhanced-->增强校验
------------------------------------------------------------------------------------------------- */
void Verify_Mode_Configuration(eType_LIN_CHKMOD eCHKMOD)
{
    SetReg(LIN_CR, CHKMOD, eCHKMOD);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Choose_LINRW
    Description    : 选择发送/接收
    Date           : 2020-07-18
    Parameter      : eLINRW: [输入] LINRW_R-->接收，LINRW_W-->发送
------------------------------------------------------------------------------------------------- */
void Choose_LINRW(eType_LIN_LINRW eLINRW)
{
    SetReg(LIN_CR, LINRW, eLINRW);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Using_AUTOSIZE
    Description    : 选择是否需要根据ID位确定数据长度
    Date           : 2020-07-18
    Parameter      : eAUTOSIZE: [输入] AUTOSIZE_N-->不需要，AUTOSIZE_E-->需要
------------------------------------------------------------------------------------------------- */
void Using_AUTOSIZE(eType_LIN_AUTOSIZE eAUTOSIZE)
{
    SetReg(LIN_CR, AUTOSIZE, eAUTOSIZE);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LINEN_Control
    Description    : 使能或不使能LIN总线功能
    Date           : 2020-07-19
    Parameter      : eLINEN: [输入] LINEN_N-->不使能，LINEN_E-->使能
------------------------------------------------------------------------------------------------- */
void LINEN_Control(eType_LIN_LINEN eLINEN)
{
    SetReg(LIN_CSR, LINEN, eLINEN);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LIN_Enable_Check
    Description    : 检测LIN总线是否已经被使能
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool LIN_Enable_Check(void)
{
    return ReadBit(LIN_CSR, LINEN);
}



/* -------------------------------------------------------------------------------------------------
    Function Name  : LINREQ_Check
    Description    : 检测是否收到帧头
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool LINREQ_Check(void)
{
    return ReadBit(LIN_SR, LINREQ);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : set_LIN_Data_Length
    Description    : 设置LIN总线发送接收数据帧长度
    Date           : 2020-07-30
    Parameter      : eLength: [输入] 2,4,8
------------------------------------------------------------------------------------------------- */
void set_LIN_Data_Length(uint8 eLength)
{
    LIN_SIZE = eLength;
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Transfer_Complete_Check
    Description    : 检验是否传输完成
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool Transfer_Complete_Check(void)
{
    return ReadBit(LIN_SR, LINDONE);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LIN_Error_Check
    Description    : 检测是否出现错误
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool LIN_Error_Check(void)
{
    return ReadBit(LIN_CSR, CLRERR);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Sync_Error_Check
    Description    : 检验是否发生同步错误
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool Sync_Error_Check(void)
{
    return ReadBit(LIN_SR, ERRSYNC);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Data_Error_Check
    Description    : 检验是否发生数据检验错误
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool Data_Error_Check(void)
{
    return ReadBit(LIN_SR, ERRCHK);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : ID_Error_Check
    Description    : 检验是否发生ID校验错误
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool ID_Error_Check(void)
{
    return ReadBit(LIN_SR, ERRPRTY);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LIN_Error_Handing
    Description    : 处理错误的函数
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
void LIN_Error_Handing(void)
{
    if (Sync_Error_Check()) //同步校验错误执行语句
    {
        ;
    }
    else if (Data_Error_Check()) //数据校验错误执行语句
    {
        ;
    }
    else if (ID_Error_Check()) // ID校验错误执行语句
    {
        ;
    }
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Bus_Time_Check
    Description    : 检验总线是否空闲超过4s
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool Bus_Time_Check(void)
{
    return ReadBit(LIN_SR, LINIDLE);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LIN_Sleep_Check
    Description    : 检测是否处于睡眠状态
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool LIN_Sleep_Check(void)
{
    return ReadBit(LIN_CSR, LINSLP);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LIN_Wakeup_Signal_Check
    Description    : 检测是否接收到唤醒信号
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool LIN_Wakeup_Signal_Check(void)
{
    return ReadBit(LIN_CSR, LINWAKEUP);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : ABORT_Error_Check
    Description    : 检验是否发生传输中断
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool ABORT_Error_Check(void)
{
    return ReadBit(LIN_SR, ABORT);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Communication_Status_Check
    Description    : 通讯状态是否繁忙检测
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
ebool Communication_Status_Check(void)
{
    return ReadBit(LIN_SR, LINACT);
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : LIN_Wakeup_Master
    Description    : 唤醒主机或者其它从机的函数
    Date           : 2020-07-27
    Parameter      : None
------------------------------------------------------------------------------------------------- */
void LIN_Wakeup_Master(void)
{
    if (LIN_Sleep_Check())
    {
        LIN_Awakening;
    }
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : get_LINID
    Description    : 获取LIN的ID
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
uint8 get_LINID(void)
{
    return LIN_ID;
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : get_LIN_Data_Length
    Description    : 获取LIN的接收发送数据帧长度
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
uint8 get_LIN_Data_Length(void)
{
    return LIN_SIZE;
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : get_LIN_BAUD
    Description    : 获取LIN的波特率
    Date           : 2020-07-30
    Parameter      : None
------------------------------------------------------------------------------------------------- */
uint16 get_LIN_BAUD(void)
{
    return LIN_BAUD;
}

/* -------------------------------------------------------------------------------------------------
    Function Name  : Sleep_Order_2Type_ID_0X1F
    Description    : 接收睡眠指令函数
    Date           : 2020-07-30
    Parameter      : None
    备注           : 睡眠ID默认为0x1F，指令默认为{0xC8,0xC8}。ID和指令均可由工程师自行更改，切记ID不
                     能与其它功能ID冲突。
------------------------------------------------------------------------------------------------- */
void Sleep_Order_2Type_ID_0X1F(void)
{

}

/*****************************************************************************
    \brief          : LIN总线诊断函数诊断
     诊断指令丢失30S自动退出诊断。
     诊断模式下不响应正常指令。
    \param          : None
    \retval         : None
*****************************************************************************/
void Diagnosis(uint8 *Buff) //进入
{
   
}



/*****************************************************************************
    \brief          : Read_Version 软硬件版本等参数的读取
    \param          : None
    \retval         : None
*****************************************************************************/
void Read_Version(uint8 PCI, uint16 DID)
{

}

/*****************************************************************************
    \brief          : Maste_Control 诊断控制——指令定位置
    \param          : None
    \retval         : None
*****************************************************************************/
void Maste_Control(uint8 PCI, uint8 DID, uint8 POST)
{

}
/*****************************************************************************
    \brief          : Inquire_ID  查询supplier ID、Function ID和 variant ID。
    \param          : None
    \retval         : None
*****************************************************************************/

void Inquire_ID(uint8 PCI, uint8 DID)
{

}

/*****************************************************************************
    \brief          : Authentication_mode  认证模式。
    \param          : None
    \retval         : None
*****************************************************************************/
void Authentication_mode(uint8 PCI, uint8 DID)
{

}
/*****************************************************************************
    \brief          : AKey_mode  验证KEY
    \param          : None
    \retval         : None
*****************************************************************************/
void AKey_mode(uint8 PCI, uint8 DID)
{

}
/*****************************************************************************
    \brief          : Authentication_delay  认证延时
    \param          : None
    \retval         : None
*****************************************************************************/
void Authentication_delay(void)
{

}

/*****************************************************************************
    \brief          : Change_NAD  安全验证后，更改NAD操作
    \param          : None
    \retval         : None
*****************************************************************************/
void Change_NAD(uint8 PCI, uint8 DID, uint8 NAD)
{


}

/*****************************************************************************
    \brief          : Change_AGS  安全验证后，更改AGS控制参数操作
    \param          : None
    \retval         : None
*****************************************************************************/
void Change_AGS(uint8 PCI, uint8 DID, uint8 Cdata)
{

    
}


/*****************************************************************************
    \brief          : Quit_Authentication  退出诊断
    \param          : None
    \retval         : None
*****************************************************************************/
void Quit_Authentication(uint8 PCI, uint8 DIDH, uint8 DIDL)
{

    if ((PCI == 0x06) && (DIDH == 0x0D) && (DIDL == 0x00))
    {
        AGS_ReplyData.PCI = 0x03; /*有效数据长度*/
        AGS_ReplyData.SID = 0x6F; /*服务ID*/
        AGS_ReplyData.DIDH = 0x0D;
        Safety.Falg = 0;

        Fla_Post.Save_Diagnostic_flag = 1;
        Diagnostic_Data.NAD = AGS_New_NAD; /*保存一下数据*/
    }
    else
    {
        AGS_ReplyData.PCI = 0x03; /*有效数据长度*/
        AGS_ReplyData.SID = 0x7F; /*服务ID*/
        AGS_ReplyData.DIDH = 0x2F;
        if (PCI != 0X06)
        {
            AGS_ReplyData.DIDL = 0x13;
        }
        else
        {
            AGS_ReplyData.DIDL = 0x11;
        }
    }
}